package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.bean.CadastroFinal;
import br.com.business.BairroBusiness;
import br.com.business.CidadeBusiness;
import br.com.business.EnderecoBusiness;
import br.com.business.EstadoCivilBusiness;
import br.com.business.LogradouroBusiness;
import br.com.business.UfBusiness;
import br.com.data.Bairro;
import br.com.data.Cidade;
import br.com.data.Endereco;
import br.com.data.EstadoCivil;
import br.com.data.Logradouro;
import br.com.data.Uf;
import br.com.data.Usuario;
import br.com.login.business.LogSistemaBusiness;
import br.com.login.business.LoginBusiness;
import br.com.login.business.UsuarioBusiness;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;
import br.com.utilidades.validacao.ValidacaoCpf;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Janeiro,29 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("view")
public class CadastroFinalBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 435978991898240810L;

    private static final Integer IDADE_MINIMA = 18;

    private EstadoCivilBusiness estadoCivilBusinessImpl;
    private UfBusiness ufBusinessImpl;
    private UsuarioBusiness usuarioBusinessImpl;
    private EnderecoBusiness enderecoBusinesImpl;
    private CidadeBusiness cidadeBusinessImpl;

    private BairroBusiness bairroBusinessImpl;
    private LogradouroBusiness logradouroBusinessImpl;

    private SessionUsaPreBean sessionUsaPreBean;

    @Autowired
    private LoginBusiness loginBusinessImpl;
    @Autowired
    private LogSistemaBusiness logSistemaBusinessImpl;

    private CadastroFinal cadastroFinal;

    private List<EstadoCivil> estadosCivis;
    private List<Uf> ufs;

    private List<SelectItem> sexo;
    private List<SelectItem> operadora;

    private String cidadeBusca;
    private List<Cidade> cidades;

    private String bairroBusca;
    private List<Bairro> bairros;

    private String logradouroBusca;
    private List<Logradouro> logradouros;

    private String cepBusca;

    private Usuario usuario;

    /**
     * Construtor
     */
    @Autowired
    public CadastroFinalBean(UsuarioBusiness usuarioBusinessImpl, EstadoCivilBusiness estadoCivilBusinessImpl,
	    UfBusiness ufBusinessImpl, EnderecoBusiness enderecoBusinesImpl, CidadeBusiness cidadeBusinessImpl,
	    BairroBusiness bairroBusinessImpl, LogradouroBusiness logradouroBusinessImpl,
	    SessionUsaPreBean sessionUsaPreBean) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.bairroBusinessImpl = bairroBusinessImpl;
	this.logradouroBusinessImpl = logradouroBusinessImpl;
	this.enderecoBusinesImpl = enderecoBusinesImpl;
	this.ufBusinessImpl = ufBusinessImpl;
	this.usuarioBusinessImpl = usuarioBusinessImpl;
	this.estadoCivilBusinessImpl = estadoCivilBusinessImpl;
	this.cidadeBusinessImpl = cidadeBusinessImpl;

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	List<EstadoCivil> estados = estadoCivilBusinessImpl.buscarPorNomeBusca("");

	EstadoCivil estIni = new EstadoCivil();
	estIni.setId(-1);
	estIni.setNome("Estado Civil");

	estadosCivis = new ArrayList<EstadoCivil>();

	estadosCivis.add(estIni);
	estadosCivis.addAll(estados);

	sexo = new ArrayList<SelectItem>();

	sexo.add(new SelectItem("N", "Sexo"));
	sexo.add(new SelectItem("M", "Masculino"));
	sexo.add(new SelectItem("F", "Feminino"));

	operadora = new ArrayList<SelectItem>();
	operadora.add(new SelectItem("-1", "Selecione a Operadora"));
	operadora.add(new SelectItem("Tim", "Tim"));
	operadora.add(new SelectItem("Vivo", "Vivo"));
	operadora.add(new SelectItem("Oi", "Oi"));
	operadora.add(new SelectItem("Claro", "Claro"));

	List<Criterio> criterios = new ArrayList<Criterio>();

	Criterio c = new Criterio();
	c.setTipo(Criterio.TIPO_INTEGER);
	c.setValue(0);
	c.setComparacao("<>");
	c.setCampo("id");

	criterios.add(c);

	ufs = ufBusinessImpl.buscarPorCriterios(criterios, "nome");

	cadastroFinal = new CadastroFinal();

	cidades = new ArrayList<Cidade>();
	bairros = new ArrayList<Bairro>();
	logradouros = new ArrayList<Logradouro>();
    }

    /**
     * buscarPorCep
     */
    public void buscarPorCep() {

	if (cepBusca.length() == 9) {

	    List<Criterio> criterios = new ArrayList<Criterio>();

	    String cepBuscaS = cepBusca.replaceAll("-", "");

	    Criterio c = new Criterio();
	    c.setTipo(Criterio.TIPO_INTEGER);
	    Integer cep = Integer.parseInt(cepBuscaS);
	    c.setValue(cep);
	    c.setComparacao("=");
	    c.setCampo("cep");

	    criterios.add(c);

	    List<Logradouro> logs = logradouroBusinessImpl.buscarPorCriterios(criterios, "");

	    if (logs.size() > 0) {

		Logradouro log = logs.get(0);

		cidades = new ArrayList<Cidade>();
		bairros = new ArrayList<Bairro>();
		logradouros = new ArrayList<Logradouro>();

		cadastroFinal.setLogradouro(log);
		logradouros.add(log);

		cadastroFinal.setBairro(log.getBairro());
		bairros.add(log.getBairro());

		cadastroFinal.setCidade(log.getBairro().getCidade());
		cidades.add(log.getBairro().getCidade());

		Uf ufTemp = log.getBairro().getCidade().getUf();

		for (Uf uft : ufs) {
		    if (uft.getId().equals(ufTemp.getId())) {
			cadastroFinal.setUf(uft);
		    }
		}

	    }

	} else {
	    String cepInvalido = super.getMensagem("MN_cep_invalido");
	    enviaMensagem(cepInvalido, cepInvalido);
	}

    }

    /**
     * buscarPorCidade
     */
    public void buscarPorCidade() {

	if (cadastroFinal.getUf() == null) {
	    cidades = new ArrayList<Cidade>();
	    String selecioneEstado = super.getMensagem("MN_selecione_estado");
	    enviaMensagem(selecioneEstado, selecioneEstado);
	} else {

	    List<Criterio> criterios = new ArrayList<Criterio>();

	    Criterio c = new Criterio();
	    c.setTipo(Criterio.TIPO_STRING_CASE_SENSITIVE);
	    c.setValue("%" + cidadeBusca + "%");
	    c.setComparacao("like");
	    c.setCampo("nome");

	    criterios.add(c);

	    Criterio c1 = new Criterio();
	    c1.setTipo(Criterio.TIPO_INTEGER);
	    c1.setValue(cadastroFinal.getUf().getId());
	    c1.setComparacao("=");
	    c1.setCampo("uf.id");

	    criterios.add(c1);

	    cidades = cidadeBusinessImpl.buscarPorCriterios(criterios, "nome ASC");

	}

    }

    /**
     * buscarPorBairro
     */
    public void buscarPorBairro() {

	if (cadastroFinal.getCidade() == null) {
	    bairros = new ArrayList<Bairro>();
	    String selecioneCidade = super.getMensagem("MN_selecione_cidade");
	    enviaMensagem(selecioneCidade, selecioneCidade);
	} else {

	    List<Criterio> criterios = new ArrayList<Criterio>();

	    Criterio c = new Criterio();
	    c.setTipo(Criterio.TIPO_STRING_CASE_SENSITIVE);
	    c.setValue("%" + bairroBusca + "%");
	    c.setComparacao("like");
	    c.setCampo("nome");

	    criterios.add(c);

	    Criterio c1 = new Criterio();
	    c1.setTipo(Criterio.TIPO_INTEGER);
	    c1.setValue(cadastroFinal.getCidade().getId());
	    c1.setComparacao("=");
	    c1.setCampo("cidade.id");

	    criterios.add(c1);

	    bairros = bairroBusinessImpl.buscarPorCriterios(criterios, "nome ASC");

	}

    }

    /**
     * buscaPorLogradouro
     */
    public void buscaPorLogradouro() {

	if (cadastroFinal.getBairro() == null) {
	    logradouros = new ArrayList<Logradouro>();
	    String selecioneEstado = super.getMensagem("MN_selecione_bairro");
	    enviaMensagem(selecioneEstado, selecioneEstado);
	} else {

	    List<Criterio> criterios = new ArrayList<Criterio>();

	    Criterio c = new Criterio();
	    c.setTipo(Criterio.TIPO_STRING_CASE_SENSITIVE);
	    c.setValue("%" + logradouroBusca + "%");
	    c.setComparacao("like");
	    c.setCampo("nome");

	    criterios.add(c);

	    Criterio c1 = new Criterio();
	    c1.setTipo(Criterio.TIPO_INTEGER);
	    c1.setValue(cadastroFinal.getCidade().getId());
	    c1.setComparacao("=");
	    c1.setCampo("bairro.id");

	    criterios.add(c1);

	    logradouros = logradouroBusinessImpl.buscarPorCriterios(criterios, "nome ASC");

	}

    }

    /**
     * finalizaCadastro
     */
    public void finalizaCadastro() {

	if (cadastroFinal.getOperadora().equals("-1")) {
	    String selecioneOperadora = super.getMensagem("MN_selecione_operadora");
	    enviaMensagem(selecioneOperadora, selecioneOperadora);
	} else {
	    if (cadastroFinal.getLogradouro() == null) {
		String selecioneLogradouro = super.getMensagem("MN_selecione_logradouro");
		enviaMensagem(selecioneLogradouro, selecioneLogradouro);
	    } else {

		// String cpfParaValidacao =
		// cadastroFinal.getCpf().replaceAll(".", "");
		// cpfParaValidacao = cpfParaValidacao.replaceAll("-", "");

		String cpfParaValidacao = cadastroFinal.getCpf();

		if (ValidacaoCpf.validarCPF(cpfParaValidacao)) {

		    List<Criterio> criterios = new ArrayList<Criterio>();

		    Criterio crit = new Criterio();
		    crit.setCampo("cnpjCpf");
		    crit.setComparacao("like");
		    crit.setTipo(Criterio.TIPO_STRING_NOT_CASE_SENSITIVE);
		    crit.setValue(cadastroFinal.getCpf());

		    criterios.add(crit);

		    List<Usuario> usuariosComCpf = usuarioBusinessImpl.buscarPorCriterios(criterios, "");

		    if (usuariosComCpf.size() > 1) {
			String cpfCadastrado = super.getMensagem("MN_cpf_cadastrado_duvida");
			enviaMensagem(cpfCadastrado, cpfCadastrado);
		    } else {

			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.YEAR, -IDADE_MINIMA);

			if (cal.getTime().after(cadastroFinal.getDataNascimento())) {

			    usuario = sessionUsaPreBean.getUsuario();

			    Endereco end = new Endereco();

			    end.setUsuario(usuario);
			    end.setComplemento(cadastroFinal.getComplemento());
			    end.setNumero(cadastroFinal.getNumero());
			    end.setLogradouro(cadastroFinal.getLogradouro());
			    end.setDataCadastro(new Date());
			    end.setAtual(1);

			    enderecoBusinesImpl.salvar(end);

			    usuario.setRg(cadastroFinal.getRg());
			    usuario.setCnpjCpf(cadastroFinal.getCpf());
			    usuario.setSexo(cadastroFinal.getSexo());
			    usuario.setCel1(cadastroFinal.getCelular());
			    usuario.setOpcel1(cadastroFinal.getOperadora());
			    usuario.setDataNasc(cadastroFinal.getDataNascimento());
			    usuario.setOrigemUsuario("USA-PRÉ-ENVIADO");

			    usuarioBusinessImpl.atualizar(usuario);

			    String cadastroFinalizado = super.getMensagem("MN_cadastro_finalizado");
			    enviaMensagem(cadastroFinalizado, cadastroFinalizado);

			    try {
				FacesContext.getCurrentInstance().getExternalContext()
					.redirect("/" + CONSTANTES.URLUSAPRE + "/aguardeEnvioCadastro.jsf");
			    } catch (Exception ex) {
				ex.printStackTrace();
			    }

			} else {

			    String msg = super.getMensagem("MN_necessario_18_anos");
			    enviaMensagem(msg, msg);

			}

		    }
		} else {
		    String cpfInvalido = super.getMensagem("MN_cpf_invalido");
		    enviaMensagem(cpfInvalido, cpfInvalido);
		}

	    }
	}

    }

    // SETS AND GETS;
    public List<EstadoCivil> getEstadosCivis() {
	return estadosCivis;
    }

    public void setEstadosCivis(List<EstadoCivil> estadosCivis) {
	this.estadosCivis = estadosCivis;
    }

    public CadastroFinal getCadastroFinal() {
	return cadastroFinal;
    }

    public void setCadastroFinal(CadastroFinal cadastroFinal) {
	this.cadastroFinal = cadastroFinal;
    }

    public List<SelectItem> getSexo() {
	return sexo;
    }

    public void setSexo(List<SelectItem> sexo) {
	this.sexo = sexo;
    }

    public List<Uf> getUfs() {
	return ufs;
    }

    public void setUfs(List<Uf> ufs) {
	this.ufs = ufs;
    }

    public String getCidadeBusca() {
	return cidadeBusca;
    }

    public void setCidadeBusca(String cidadeBusca) {
	this.cidadeBusca = cidadeBusca;
    }

    public List<Cidade> getCidades() {
	return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
	this.cidades = cidades;
    }

    public List<SelectItem> getOperadora() {
	return operadora;
    }

    public void setOperadora(List<SelectItem> operadora) {
	this.operadora = operadora;
    }

    public String getBairroBusca() {
	return bairroBusca;
    }

    public void setBairroBusca(String bairroBusca) {
	this.bairroBusca = bairroBusca;
    }

    public List<Bairro> getBairros() {
	return bairros;
    }

    public void setBairros(List<Bairro> bairros) {
	this.bairros = bairros;
    }

    public String getLogradouroBusca() {
	return logradouroBusca;
    }

    public void setLogradouroBusca(String logradouroBusca) {
	this.logradouroBusca = logradouroBusca;
    }

    public List<Logradouro> getLogradouros() {
	return logradouros;
    }

    public void setLogradouros(List<Logradouro> logradouros) {
	this.logradouros = logradouros;
    }

    public String getCepBusca() {
	return cepBusca;
    }

    public void setCepBusca(String cepBusca) {
	this.cepBusca = cepBusca;
    }

}
